package Day18.Inner07;

/**
 * @author HYHwtx
 * @version 1.0
 * @date 2022/2/25 18:23
 */
/**
*说明：静态内部类是定义在外部类的成员位置，并且是static修饰
 * 1.可以直接访问外部类的所有静态成员，包括私有的，但是不能访问非静态成员
 */

public class StaticInnerClass {
    public static void main(String[] args) {
        Outer10 outer10=new Outer10();
        outer10.m1();
        //8.外部其他类怎么来访问静态内部类
        //方式1
        //因为是静态内部类，是可以通过类名直接访问(前提是满足访问权限)
        Outer10.Inner10 inner10=new Outer10.Inner10();
        inner10.say();
        //方式2
        //编写一个方法，可以返回静态内部类的对象实例
        Outer10.Inner10 inner11=new Outer10.Inner10();
        inner11.say();
        //方式3
        Outer10.Inner10 inner101=Outer10.getInner10_();
        inner101.say();
    } 
}

class Outer10{//外部类
    private int n1 = 10;
    private static String name = "张三";

    //6.静态内部类—————访问————外部类（静态属性）访问方式，直接访问所有的静态成员
    private static void  cry(){}
        //静态内部类
        //1.放在外部类的成员位置
        //2.使用static修饰
        //4.可以添加任意访问修饰符（4中），因为他的地位就是一个成员
        //5.作用域：同其他的成员，为整个类体

    protected static class Inner10{
        private static String name = "加中实训";
        //3.可以直接访问外部类的所有静态成员，包括私有的，但是不能直接访问非静态成员
        void say(){
            System.out.println(name);

            //9.如果外部类和内部类的成员重名的时候，静态内部类访问的话，默认遵循就近原则。
            // 如果想要访问外部类的成员，则可以使用（外部类名.成员）去访问
            System.out.println("外部类名 name="+Outer10.name);
        }
    }
    //7.外部类---访问---内部类，访问方式 创建对象 在访问
    public void m1(){
        Inner10 inner10 = new Inner10();
        inner10.say();
    }
//方式2
    public Inner10 getInner10(){
        return new Inner10();

    }
    //在写一个静态的
    public static  Inner10 getInner10_(){
        return new Inner10();

    }
}
/*
小结：
1.内部类有四种，局部内部类，匿名内部类，成员内部类，静态内部类
2.重点 匿名内部类
new 类/接口(参数列表){
    //。。。
}
3.成员和静态都在成员位置上，本质就是一个成员
 */